Цикл for...in — перебор ключей объекта
Цикл for...in перебирает ключевые свойства объекта — то есть имена (ключи) его перечисляемых свойств.
Синтаксис
for (ключ in объект) {
// тело цикла
}
Пример: перебор свойств объекта
const user = {
name: "Анна",
age: 28,
role: "администратор"
};
for (let key in user) {
console.log(key + ": " + user[key]);
}
Вывод:
name: Анна
age: 28
role: администратор
Каждая итерация возвращает имя свойства — строку. Чтобы получить значение, нужно обратиться через объект[ключ].
Особенности
- Перебирает только перечисляемые свойства (те, что можно увидеть в
Object.keys()). - Включает свойства, унаследованные от прототипа, если они не помечены как
enumerable: false. - Порядок не гарантирован — особенно для числовых ключей, которые могут быть отсортированы по возрастанию.
Почему не подходит для массивов?
const arr = ["a", "b", "c"];
arr.extra = "лишнее"; // добавили нечисловое свойство
for (let key in arr) {
console.log(key); // выведет: "0", "1", "2", "extra"
}
Проблемы:
- Не только индексы —
for...inперебирает все перечисляемые свойства, включая те, что добавлены вручную. - Порядок может нарушиться — в некоторых движках числовые ключи сортируются по возрастанию, даже если они были добавлены в другом порядке.
- Нет гарантии, что вы получите только элементы массива — если библиотека расширила
Array.prototype, это тоже попадёт в цикл.
Правило
Не используйте
for...inдля массивов.
Используйтеfor...ofили классическийfor.
Для массивов for...in — источник багов. Для объектов — нормально, если вы знаете, что делаете.